using System;
using System.Data;
using MySql.Data.MySqlClient;
using System.Collections;
using System.Collections.Specialized;
using System.Collections.Generic;
using Novapangeia.Dominio;

namespace Novapangeia.Repositorio
{	
	public partial class RepositorioNegociacao
	{	   
		
		private ISqlHelper sqlHelper;
		
		public  RepositorioNegociacao(ISqlHelper _sqlHelper)
        {
            if (_sqlHelper == null)
                sqlHelper = new SqlHelper();
            else
                sqlHelper = _sqlHelper;
        }
		
		#region Parameters
		public static class Parameters
		{
			public static MySqlParameter Id
			{
				get
				{
					return new MySqlParameter("p_Id", MySqlDbType.Int32, 0);
				}
			}
			
			public static MySqlParameter Usuario_ofertante
			{
				get
				{
					return new MySqlParameter("p_Usuario_ofertante", MySqlDbType.Int32, 0);
				}
			}
			
			public static MySqlParameter Usuario_comprador
			{
				get
				{
					return new MySqlParameter("p_Usuario_comprador", MySqlDbType.Int32, 0);
				}
			}
			
			public static MySqlParameter Rodada_criacao
			{
				get
				{
					return new MySqlParameter("p_Rodada_criacao", MySqlDbType.Int32, 0);
				}
			}
			
			public static MySqlParameter Rodada_aceitacao
			{
				get
				{
					return new MySqlParameter("p_Rodada_aceitacao", MySqlDbType.Int32, 0);
				}
			}
			
			public static MySqlParameter Rodada_entrega
			{
				get
				{
					return new MySqlParameter("p_Rodada_entrega", MySqlDbType.Int32, 0);
				}
			}
			
			public static MySqlParameter Madeira_ofertante
			{
				get
				{
					return new MySqlParameter("p_Madeira_ofertante", MySqlDbType.Int32, 0);
				}
			}
			
			public static MySqlParameter Minerio_ofertante
			{
				get
				{
					return new MySqlParameter("p_Minerio_ofertante", MySqlDbType.Int32, 0);
				}
			}
			
			public static MySqlParameter Comida_ofertante
			{
				get
				{
					return new MySqlParameter("p_Comida_ofertante", MySqlDbType.Int32, 0);
				}
			}
			
			public static MySqlParameter Madeira_comprador
			{
				get
				{
					return new MySqlParameter("p_Madeira_comprador", MySqlDbType.Int32, 0);
				}
			}
			
			public static MySqlParameter Minerio_comprador
			{
				get
				{
					return new MySqlParameter("p_Minerio_comprador", MySqlDbType.Int32, 0);
				}
			}
			
			public static MySqlParameter Comida_comprador
			{
				get
				{
					return new MySqlParameter("p_Comida_comprador", MySqlDbType.Int32, 0);
				}
			}
			
			public static MySqlParameter Fechada
			{
				get
				{
					return new MySqlParameter("p_Fechada", MySqlDbType.Byte, 0);
				}
			}
			
		}
		#endregion		
		
		//=================================================================
		//  Carrega todos os registros do banco de dados
		//=================================================================
		public List<Negociacao> LoadAll() 
		{
			string sql = @"SELECT id, usuario_ofertante, usuario_comprador, madeira_ofertante, minerio_ofertante, 
                                   comida_ofertante, madeira_comprador, minerio_comprador, comida_comprador, fechada FROM negociacao";
					
			List<Negociacao> entityList = new List<Negociacao>();
			
			MySqlDataReader reader = sqlHelper.ExecuteReader(CommandType.Text, sql);
			
			Negociacao entity;
			
			while (reader.Read())
            {
                entity = PreencherNegociacao(reader);
				entityList.Add(entity);
            }

            reader.Close();
			
			return entityList;
		}

        public List<Negociacao> ListarNegociacoesEmAberto()
        {
            string sql = @"SELECT id, usuario_ofertante, usuario_comprador, madeira_ofertante, minerio_ofertante, 
                                   comida_ofertante, madeira_comprador, minerio_comprador, comida_comprador, fechada FROM negociacao WHERE fechada = 0";

            List<Negociacao> entityList = new List<Negociacao>();

            MySqlDataReader reader = sqlHelper.ExecuteReader(CommandType.Text, sql);

            Negociacao entity;

            while (reader.Read())
            {
                entity = PreencherNegociacao(reader);
                entityList.Add(entity);
            }

            reader.Close();

            return entityList;
        }

        public List<Negociacao> ListarNegociacoesFechadasPorUsuarioId(Int32 idUsuario)
        {
            string sql = @"SELECT id, usuario_ofertante, usuario_comprador, madeira_ofertante, minerio_ofertante, 
                                   comida_ofertante, madeira_comprador, minerio_comprador, comida_comprador, fechada FROM negociacao 
                           WHERE fechada = 1 AND (usuario_ofertante = @p_usuarioId OR usuario_comprador = @p_usuarioId)";

            MySqlParameter p;
            p = new MySqlParameter("p_usuarioId", MySqlDbType.UInt32);
            p.Value = idUsuario;

            List<Negociacao> entityList = new List<Negociacao>();

            MySqlDataReader reader = sqlHelper.ExecuteReader(CommandType.Text, sql, new MySqlParameter[] { p });

            Negociacao entity;

            while (reader.Read())
            {
                entity = PreencherNegociacao(reader);
                entityList.Add(entity);
            }

            reader.Close();

            return entityList;
        }
	
		//=================================================================
		//  Carrega apenas um registro, buscado pela chave primária
		//=================================================================
		public Negociacao ConsultarPorPK(int Id)
		{
            string sql = @"SELECT id, usuario_ofertante, usuario_comprador, madeira_ofertante, minerio_ofertante, 
                                   comida_ofertante, madeira_comprador, minerio_comprador, comida_comprador, fechada FROM negociacao WHERE(id = @p_id)";
                                   

			MySqlParameter p;
			p = Parameters.Id;
			p.Value = Id;

            MySqlDataReader reader = sqlHelper.ExecuteReader(CommandType.Text, sql, new MySqlParameter[] { p }, CommandBehavior.SingleRow);
			
			Negociacao negociacao = new Negociacao();
			
			if(reader.HasRows)
            {
				reader.Read();
				negociacao = PreencherNegociacao(reader);
            }
            else
            {
                negociacao = null;
            }

            reader.Close();
			return negociacao;
		}
		
        private Negociacao PreencherNegociacao(MySqlDataReader  r)
        {
            Negociacao negociacao = new Negociacao();

            negociacao.Id = r.GetInt32("id");
            negociacao.usuarioOfertante = r.GetInt32("usuario_ofertante");
            if (r["usuario_comprador"] == DBNull.Value)
                negociacao.usuarioComprador = null;
            else
                negociacao.usuarioComprador = r.GetInt32("usuario_comprador");
            negociacao.madeiraOfertante = r.GetInt32("madeira_ofertante");
            negociacao.minerioOfertante = r.GetInt32("minerio_ofertante");
            negociacao.comidaOfertante = r.GetInt32("comida_ofertante");
            negociacao.madeiraComprador = r.GetInt32("madeira_comprador");
            negociacao.minerioComprador = r.GetInt32("minerio_comprador");
            negociacao.comidaComprador = r.GetInt32("comida_comprador");
			negociacao.negociacaoFechada = r.GetBoolean("fechada");

            return negociacao;
        }
	
		public bool CadastrarNegociacao(Negociacao negociacao)
		{
		    bool cadastrou = false;
		    string sql =
		        @"INSERT
                INTO negociacao
                (
                    usuario_ofertante,                                
                    madeira_ofertante,
                    minerio_ofertante,
                    comida_ofertante,
                    madeira_comprador,
                    minerio_comprador,
                    comida_comprador,
                    fechada
                )
                VALUES
                (
                    @p_usuario_ofertante,                                    
                    @p_madeira_ofertante,
                    @p_minerio_ofertante,
                    @p_comida_ofertante,
                    @p_madeira_comprador,
                    @p_minerio_comprador,
                    @p_comida_comprador,
                    @p_fechada
                )";

			List<MySqlParameter> parameters = new List<MySqlParameter>();
			
			MySqlParameter p;
			
			p = Parameters.Usuario_ofertante;
			p.Value = negociacao.usuarioOfertante;
			parameters.Add(p);

			
			p = Parameters.Madeira_ofertante;
			p.Value = negociacao.madeiraOfertante;
			parameters.Add(p);

			p = Parameters.Minerio_ofertante;
			p.Value = negociacao.minerioOfertante;
			parameters.Add(p);

			p = Parameters.Comida_ofertante;
			p.Value = negociacao.comidaOfertante;
			parameters.Add(p);

			p = Parameters.Madeira_comprador;
			p.Value = negociacao.madeiraComprador;
			parameters.Add(p);

			p = Parameters.Minerio_comprador;
			p.Value = negociacao.minerioComprador;
			parameters.Add(p);

			p = Parameters.Comida_comprador;
			p.Value = negociacao.comidaComprador;
			parameters.Add(p);

			p = Parameters.Fechada;
			p.Value = negociacao.negociacaoFechada;
			parameters.Add(p);


            cadastrou = sqlHelper.ExecuteSql(CommandType.Text, sql, parameters.ToArray());
		    return cadastrou; 
		}
	
		public bool AtualizarNegociacao(Negociacao negociacao)
		{
		    string sql =
		        @"UPDATE negociacao
	                        SET
		                        usuario_ofertante = @p_usuario_ofertante,
		                        usuario_comprador = @p_usuario_comprador,		                       
		                        madeira_ofertante = @p_madeira_ofertante,
		                        minerio_ofertante = @p_minerio_ofertante,
		                        comida_ofertante = @p_comida_ofertante,
		                        madeira_comprador = @p_madeira_comprador,
		                        minerio_comprador = @p_minerio_comprador,
		                        comida_comprador = @p_comida_comprador,
		                        fechada = @p_fechada
	                        WHERE
		                        id = @p_id";
			List<MySqlParameter> parameters = new List<MySqlParameter>();
			
			MySqlParameter p;
			
			p = Parameters.Id;
			p.Value = negociacao.Id;
			parameters.Add(p);

			p = Parameters.Usuario_ofertante;
			p.Value = negociacao.usuarioOfertante;
			parameters.Add(p);

			p = Parameters.Usuario_comprador;
			p.Value = negociacao.usuarioComprador;
			parameters.Add(p);

			p = Parameters.Madeira_ofertante;
			p.Value = negociacao.madeiraOfertante;
			parameters.Add(p);

			p = Parameters.Minerio_ofertante;
			p.Value = negociacao.minerioOfertante;
			parameters.Add(p);

			p = Parameters.Comida_ofertante;
			p.Value = negociacao.comidaOfertante;
			parameters.Add(p);

			p = Parameters.Madeira_comprador;
			p.Value = negociacao.madeiraComprador;
			parameters.Add(p);

			p = Parameters.Minerio_comprador;
			p.Value = negociacao.minerioComprador;
			parameters.Add(p);

			p = Parameters.Comida_comprador;
			p.Value = negociacao.comidaComprador;
			parameters.Add(p);

			p = Parameters.Fechada;
			p.Value = negociacao.negociacaoFechada;
			parameters.Add(p);

            return sqlHelper.ExecuteSql(CommandType.Text, sql, parameters.ToArray());	
		}
	}
}
